package com.fyy.utils.file;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

/**
 * @Author fyy
 * @Description 文件工具类
 * @Date 2020/12/21 11:24
 */
public class FileUtil {

    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);
    private FileUtil(){}; //私有构造方法

    /**
     * @Author fyy
     * @Description 文件是否存在
     * @param filePath 文件路径
     * @Date 2021/1/26 14:23
     */
    public static boolean isExist(String filePath){
        File file = new File(filePath);
        return file.exists();
    }

    /**
     * @Author fyy
     * @Description 文件是否为文件夹
     * @param filePath 文件路径
     * @Date 2021/1/26 14:25
     */
    public static boolean isDir(String filePath){
        File file = new File(filePath);
        if(!file.exists()){
            logger.error("文件不存在:{}",filePath);
            return false;
        }
        return file.isDirectory();
    }

    /**
     * @Author fyy
     * @Description 文件是否为文件
     * @param filePath 文件路径
     * @Date 2021/1/26 14:25
     */
    public static boolean isFile(String filePath){
        File file = new File(filePath);
        if(!file.exists()){
            logger.error("文件不存在:{}",filePath);
            return false;
        }
        return !file.isDirectory();
    }

    /**
     * @Author fyy
     * @Description 创建文件或目录
     * @param filePath 文件路径
     * @Date 2021/1/26 14:34
     */
    public static boolean mkFilePath(String filePath){
        File file = new File(filePath);
        if(file.exists()){
            logger.error("文件或目录已存在:{}",filePath);
            return false;
        }
        return file.mkdirs();
    }

    /**
     * @Author fyy
     * @Description 删除文件或文件夹
     * @param filePath 文件路径
     * @Date 2021/1/26 15:11
     */
    public static void delFile(String filePath){
        File file = new File(filePath);
        if(!file.exists()){
            logger.error("文件不存在:{}",filePath);
            return;
        }
        if(!file.isDirectory()){
           file.delete();
           return;
        }
        File[] files =  file.listFiles();
        for (File f : files) {
            delFile(f.getPath());
        }
    }


    /**
     * @Author fyy
     * @Description 读取文件内容到buffer
     * @param filePath 文件路径
     * @Date 2021/1/26 15:03
     */
    private static void readToBuffer(StringBuffer buffer, String filePath) throws Exception {
        File file = new File(filePath);
        if(!file.exists()){
            logger.error("文件不存在:{}",filePath);
            return;
        }
        if(file.isDirectory()){
            logger.error("文件路径错误:{}",filePath);
            return;
        }
        InputStream in = new FileInputStream(file);
        String line;
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        line = reader.readLine(); //读取首行内容
        while (line != null){
            buffer.append(line); //追加内容
            buffer.append("\n"); //追加换行
            line = reader.readLine(); //读取下一行内容
        }
        reader.close();
        in.close();
    }

    /**
     * @Author fyy
     * @Description 文件转byte[]字节流
     * @param filePath 文件路径
     * @Date 2021/1/26 14:56
     */
    public static String readFile(String filePath) throws Exception {
        StringBuffer sb = new StringBuffer();
        readToBuffer(sb, filePath);
        return sb.toString();
    }

    /**
     * @Author fyy
     * @Description 文件转byte[]字节流
     * @param filePath 文件路径
     * @Date 2021/1/26 14:56
     */
    public static byte[] toBytes(String filePath) throws Exception {
        File file = new File(filePath);
        if(!file.exists()){
            logger.error("文件不存在:{}",filePath);
            return null;
        }
        if(file.isDirectory()){
            logger.error("文件路径错误:{}",filePath);
            return null;
        }
        InputStream in = new FileInputStream(file);
        byte[] buffer = new byte[(int) file.length()];
        in.read(buffer);
        in.close();
        return buffer;
    }

    /**
     * @Author fyy
     * @Description
     * @param filePath 文件路径
     * @param bytes 文件字节流
     * @Date 2021/1/26 15:35
     */
    public static void toFile(String filePath,byte[] bytes){
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        try{
            File file = new File(filePath);
            boolean isE = file.exists();
            if(isE){
                logger.error("文件已存在:{}",filePath);
                return;
            }
            boolean isDir = file.isDirectory();
            if(isDir){
                logger.error("文件类型错误:{}",filePath);
                return;
            }
            file.mkdirs(); //创建文件
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bytes);
        } catch (IOException e) {
            logger.error("文件读取错误:{}",e.getMessage(),e);
        } finally {
            try {
                if(null != fos)fos.close();
                if(null != bos) bos.close();
            }catch (Exception e){
                logger.error("文件读取流关闭异常:{}",e.getMessage(),e);
            }
        }
    }

}
